#!groovy

// Copyright 2020 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// ------------------------------------------------------------------------------

pipeline {
    agent {
        node {
            label 'slave-1'
            customWorkspace "workspace/${env.BUILD_TAG}"
        }
    }

    options {
        timestamps()
        buildDiscarder(logRotator(daysToKeepStr: '31'))
    }

    environment {
        ISOLATION_ID = sh(returnStdout: true,
                          script: 'printf $BUILD_TAG | sha256sum | cut -c1-64').trim()
        COMPOSE_PROJECT_NAME = sh(returnStdout: true,
                          script: 'printf $BUILD_TAG | sha256sum | cut -c1-64').trim()
    }

    stages {
        stage('Check for Signed-Off Commits') {
            steps {
                sh '''#!/bin/bash -l
                    if [ -v CHANGE_URL ] ;
                    then
                        temp_url="$(echo $CHANGE_URL |sed s#github.com/#api.github.com/repos/#)/commits"
                        pull_url="$(echo $temp_url |sed s#pull#pulls#)"

                        IFS=$'\n'
                        for m in $(curl -s "$pull_url" | grep "message") ; do
                            if echo "$m" | grep -qi signed-off-by:
                            then
                              continue
                            else
                              echo "FAIL: Missing Signed-Off Field"
                              echo "$m"
                              exit 1
                            fi
                        done
                        unset IFS;
                    fi
                '''
            }
        }

        stage('Run Lint') {
            steps {
                sh 'docker-compose -f docker-compose-lint.yaml up --exit-code-from avalon-lint'
                sh './scripts/sgx-hw.sh config/singleton_enclave_config.toml'
            }
        }

        stage('Build avalon components') {
            steps {
                parallel (
                    "Build Avalon Direct Model Components in SGX-HW mode": {
                        script {
                            sh 'docker-compose -f ci/docker-compose-direct-model.yaml -f ci/docker-compose-direct-model-sgx.yaml build'
                        }
                    },
                    "Build Avalon Proxy Model Components": {
                        script {
                            sh 'docker-compose -f ci/docker-compose-fabric-proxy-model.yaml build'
                        }
                    },
                    "Start fabric network": {
                        script {
                            sh './scripts/start_fabric.sh -w ./ -u'
                        }
                    }
                )
            }
        }
 
        stage('Run Avalon Direct Model Tests') {
            steps {
                sh 'INSTALL_TYPE="" ./bin/run_tests -s'
            }
        }

        stage('Run Avalon Fabric proxy Model Tests') {
            steps {
                sh 'INSTALL_TYPE="" ./bin/run_tests -x'
            }
        }

        stage('Create git archive') {
            steps {
                sh '''
                    REPO=$(git remote show -n origin | grep Fetch | awk -F'[/.]' '{print $6}')
                    git archive HEAD --format=zip -9 --output=$REPO.zip
                    git archive HEAD --format=tgz -9 --output=$REPO.tgz
                '''
            }
        }

    }

    post {
        always {
            echo 'Cleaning up fabric network'
            sh './scripts/start_fabric.sh -w ./ -c'
        }
        success {
            archiveArtifacts '*.tgz, *.zip'
            githubNotify context: 'continuous-integration/jenkins/SGX-HW mode', description: 'This commit looks good',  status: 'SUCCESS'
        }
        aborted {
            githubNotify context: 'continuous-integration/jenkins/SGX-HW mode', description: 'This commit is aborted',  status: 'FAILURE'
            error "Aborted, exiting now"
        }
        failure {
            githubNotify context: 'continuous-integration/jenkins/SGX-HW mode', description: 'This commit is failed',  status: 'FAILURE'
            error "Failed, exiting now"
        }
    }
}

